package demo02_oop

/**
 * 特质
 *   可以实现多重继承的功能，类似于java中的接口
 * java1.8之前 接口中只能存在抽象方法 从1.8开始允许存在 default定义的普通方法
 * scala 的trait类中允许存在抽象方法和普通方法
 *
 * 从用法上 抽象类和特质类 非常类似；区别就是：抽象类只能实现单继承，特质类可以实现多重继承
 *
 */
trait Animal{
  val name:String
  val age:Int = 10
  def eat():String
  def sleep() = {
    println("动物需要睡觉")
  }
}

trait FourLegs{
  def walk()
}

trait Jumpable{
  def jump()
}

//java中对于接口，必须使用的是 implements
//scala中不管后面接的是class 还是 trait，当前class后面第一个位置必须是extends
//java中implements后面的多个类通过逗号分隔
//scala中with后面只能接一个trait，但是可以有多个with
class Dog extends Animal with FourLegs with Jumpable {
  override val name: String = ???

  override def eat(): String = ???

  override def walk(): Unit = ???

  override def jump(): Unit = ???
}


class BaseName{
  override def toString: String = " base "
}

trait AName{
  override def toString: String = " A " + super.toString
}

trait BName{
  override def toString: String = " B " + super.toString
}

trait CName{
  override def toString: String = " C " + super.toString
}

//当前类的直接父类是最右侧的类，顺序向左依次增加
class Name extends BaseName with AName with BName with CName{
  override def toString: String = " Name " + super.toString
}



object Demo05_trait {

  def main(args: Array[String]): Unit = {
    val name = new Name
    println(name)
  }

}
